/** /* Rob Mayfield. IMSI @1997 The text window uses a small subset of HTML to display multiple color in the text. This is done in the displayText class. Eventually Multi font, size, style and color text box **/ import java.awt.*; public class textDisplay extends Canvas { String Text; int width, height, left, top; // area of text box java.awt.Color foreGround, backGround; java.util.Vector dText = new java.util.Vector(); java.util.Vector dColor = new java.util.Vector(); int curPos = 0; int viewLeftPos = 0; int topLine = 0; // first line on screen int prevTopLine = -1; // previous top line on screen. Used in checking if repaint needed. int aveCharWidth = 0; int textLengthMax = 0, textCharLenghtMax = 0; int totalLines = 0; int lineHeight = 0; int lines = 0; boolean first = true; ViewSourceDialog parent; //Color prevTopColor = Color.black; Font topFont; int wow=0; textDisplay () { super(); foreGround = Color.black; backGround = Color.white; this.parent = (ViewSourceDialog) getParent(); } public void setText(String Str) { int jj=0; Text = Str; String S; Color prevColor = foreGround; // set up first color for line 1 int cnt = 0; while ((S = getNextString()) != null) { String trimStr = rTrim(S); dText.addElement(trimStr); // add to Vector boolean tag = false; int cntChar = 0; for (int ii = 0; ii< trimStr.length(); ii++) { if (trimStr.charAt(ii) == '<') tag = true; if (trimStr.charAt(ii) == '>') tag = false; if (!tag) cntChar++; } if (cntChar > textCharLenghtMax) textCharLenghtMax = cntChar; Color c; if (cnt == 0) { // find start color for first line String upStr = trimStr.toUpperCase(); int fPos, cPos; if ((fPos=upStr.indexOf("<FONT")) > -1 && (cPos=upStr.indexOf("COLOR=")) > -1) { if (fPos != 0) // font not set in first chars prevColor = foreGround; else prevColor = getFirstColor (trimStr); } else prevColor = foreGround; dColor.addElement(prevColor); // add the color to start line 0 } else { dColor.addElement(prevColor); prevColor = ((c=getEndColor (trimStr)) == null) ? prevColor : c; } //System.out.println("cnt: " + cnt cnt++; } repaint(); } // finds the next string delimited by HTML <br> public String getNextString() { int Start = curPos; int End = curPos; boolean found = false; if (Start > Text.length() || Text.length() == 0) return null; while (curPos < Text.length()) { char c = Text.charAt(curPos); if (curPos+3 < Text.length() && Text.charAt(curPos) == '<' && (Text.charAt(curPos+1) == 'b' || Text.charAt(curPos+1) == 'B') && (Text.charAt(curPos+2) == 'r' || Text.charAt(curPos+2) == 'R') && Text.charAt(curPos+3) == '>') { End = curPos; curPos += 4; found = true; break; } curPos++; //c = 'a'; } if (curPos == Text.length()) { if (End == Start) { curPos++; // increment so next call to getNextString() will return null return Text.substring(Start, curPos-1); } else return Text.substring(Start, End); } else if (End == Start) { if (found) return (" "); // return blank line (well almost blank with one space). we do this so calling routine reads another line. return null; } else { return (Text.substring(Start, End)); } } public void resize (int width, int height) { this.width = width; this.height = height; repaint(); } public synchronized void reshape (int left, int top, int width, int height) { this.left = left; this.top = top; this.width = width; this.height = height; super.reshape(left, top, width, height); lines = 0; // reset the number of showing lines in text area repaint(); } public synchronized void setBackground(Color c) { super.setBackground(c); backGround = c; } public synchronized void setForeground(Color c) { super.setForeground(c); foreGround = c; } public void verticalScrollbarAction(int Action, Object arg) { int sPos = ((Integer) arg).intValue(); topLine = sPos; if (topLine != prevTopLine) repaint(); prevTopLine = topLine; } public void horizontalScrollbarAction(int Action, Object arg) { int sPos = ((Integer) arg).intValue(); viewLeftPos = -sPos * aveCharWidth; repaint(); } // get color for end of line by reading FONT tag public Color getEndColor (String Str) { int fPos, cPos, pos = 0; String upStr = Str.toUpperCase(); if ((fPos=upStr.lastIndexOf("<FONT")) > -1 && (cPos=upStr.lastIndexOf("COLOR=")) > -1) { cPos += 6; if (Str.charAt(cPos)=='\"') cPos++; // find beginning of hex or long color number if (Str.charAt(cPos)=='\'') cPos++; // find beginning of hex or long color number if (Str.charAt(cPos)=='#') { cPos++; // find beginning of hex or long color number int Start = cPos; // starting position of number while (Str.charAt(cPos) != '\"' && Str.charAt(cPos) != ' ' && Str.charAt(cPos) != '\'') cPos++; // find end of number String hexString = upStr.substring(Start, cPos); // get number as string while (Str.charAt(cPos) != '>' && cPos < Str.length()) cPos++; // find end of number if (hexString.length() != 6) return null; int intColor = Integer.parseInt(hexString, 16); // convert from hex string to int return (new Color(intColor)); // new color } else return null; } else return null; } // get color for beginning of each line public Color getFirstColor (String Str) { int fPos, cPos, pos = 0; String upStr = Str.toUpperCase(); if ((fPos=upStr.indexOf("<FONT", pos)) > -1 && (cPos=upStr.indexOf("COLOR=", pos)) > -1) { cPos += 6; if (Str.charAt(cPos)=='\"') cPos++; // find beginning of hex or long color number if (Str.charAt(cPos)=='\'') cPos++; // find beginning of hex or long color number if (Str.charAt(cPos)=='#') { cPos++; // find beginning of hex or long color number int Start = cPos; // starting position of number while (Str.charAt(cPos) != '\"' && Str.charAt(cPos) != ' ' && Str.charAt(cPos) != '\'') cPos++; // find end of number String hexString = upStr.substring(Start, cPos); // get number as string while (Str.charAt(cPos) != '>' && cPos < Str.length()) cPos++; // find end of number if (hexString.length() != 6) return null; int intColor = Integer.parseInt(hexString, 16); // convert from hex string to int return (new Color(intColor)); // new color } else return null; } else return null; } public void paint(java.awt.Graphics g) { String Str, resultStr, upStr, drawStr; Font cFont = new Font("Courier", Font.BOLD, 12); g.setFont(cFont); //g.setColor(prevTopColor); // get default color Color fg = foreGround; FontMetrics fm = g.getFontMetrics(cFont); if (aveCharWidth == 0) aveCharWidth = fm.stringWidth("M"); // get the average char width for incremental scrolling if (lineHeight == 0) lineHeight = fm.getHeight(); // get the height of a line if (lines == 0) lines = height/lineHeight; int num = ((dText.size() - topLine) < lines) ? dText.size() - topLine : lines; // cycle through the lines of text and draw to screen for (int ii = 0; ii < num; ii++) { if (topLine > dText.size() - 1) break; Str = (String)dText.elementAt(ii+topLine); g.setColor((Color)dColor.elementAt(ii+topLine)); //g.setFont((Font)dFont.elementAt(ii+topLine)); int drawPos = 1; // starting position to draw string upStr = Str.toUpperCase(); int cPos = -1; int fPos = -1; int pos = 0; boolean printAsIs = false; boolean foundFontTag = false; // see if font or color change. If not just draw text for line, else draw in different font and color while ((fPos=upStr.indexOf("<FONT", pos)) > -1 && (cPos=upStr.indexOf("COLOR=", pos)) > -1) { foundFontTag = true; printAsIs = false; cPos += 6; if (Str.charAt(cPos)=='\"') cPos++; // find beginning of hex or long color number if (Str.charAt(cPos)=='\'') cPos++; // find beginning of hex or long color number if (Str.charAt(cPos)=='#') cPos++; // find beginning of hex or long color number else { printAsIs = true; break; // not a valid hex number ("#FF00FF" format) } int Start = cPos; // starting position of number while (Str.charAt(cPos) != '\"' && Str.charAt(cPos) != ' ' && Str.charAt(cPos) != '\'') cPos++; // find end of number String hexString = upStr.substring(Start, cPos); // get number as string while (Str.charAt(cPos) != '>' && cPos < Str.length()) cPos++; // find end of number if (hexString.length() != 6) { printAsIs = true; break; // not a valid hex number ("#FF00FF" format) } drawStr = Str.substring(pos, fPos); g.drawString(drawStr, drawPos+viewLeftPos, lineHeight * (ii+1)); // draw string in current color drawPos += fm.stringWidth(drawStr); int intColor = Integer.parseInt(hexString, 16); // convert from hex string to int fg = new Color(intColor); // set new color g.setColor(fg); // return to entry color pos = cPos+1; } if (foundFontTag) { g.setColor(fg); // return to entry color g.drawString(Str.substring(pos, Str.length()), drawPos+viewLeftPos, lineHeight * (ii+1)); // draw string in current color if (first) // find max length of string { int wid = drawPos + fm.stringWidth(Str.substring(pos, Str.length())); // add last segment to length if (wid > textLengthMax) textLengthMax = wid; } } if (!foundFontTag || printAsIs) { if (first) // find max length of string { int wid = fm.stringWidth(Str); if (wid > textLengthMax) textLengthMax = wid; } g.drawString (Str, 1+viewLeftPos, lineHeight * (ii+1)); } foreGround = fg; // return to entry color //if (ii == 0) prevTopColor = fg; } if (first) { textLengthMax = (textLengthMax + 30) / aveCharWidth; // add slop space for scrolling if (textCharLenghtMax > textLengthMax) textLengthMax = textCharLenghtMax; ViewSourceDialog parent = (ViewSourceDialog) getParent(); parent.horizontalScrollbar.setPageIncrement(textLengthMax/4); parent.horizontalScrollbar.setValues(0, 6, 0, textLengthMax); totalLines = dText.size(); parent.verticalScrollbar.setPageIncrement(totalLines/4); parent.verticalScrollbar.setValues(0, 6, 0, totalLines); } first = false; } public String rTrim(String Str) { int iLen, len; len = iLen = Str.length() - 1; int st = 0; while ((len > 0) && (Str.charAt(len) <= ' ')) { len--; } return (len < iLen) ? Str.substring(st, len+1) : Str; } } // End of class textDisplay
SDK Top API Reference TurboCAD Home Page TurboCAD Programming Forums